#ifndef __PID_H__
#define __PID_H__


#include "sys.h"

//PID控制器
typedef struct PID_IncTypeDef
{
    double kp;               	//比例系数Proportional
    double ki;               	//积分系数Integral
    double kd;               	//微分系数Derivative
    
    double integrator;       	//积分项
    double imax;             	//积分项最大值 双边 -imax<i<imax
    
    double derivative;       	//微分项
    double dmax;             	//微分项最大值 双边 -imax<i<imax
    
    double error;           	//当前误差
    double last_error;       	//上一次误差
	double last_last_error;		//上上一次误差
    
    double last_t;           	//上一次计算PID的时间
    
    double OutP;             	//P算法输出
    double OutI;             	//I算法输出
    double OutD;             	//D算法输出
    
    double Out;              	//PID计算输出
    double OutMax;           	//PID计算最大值
    
    int (*GetPid)(struct PID_IncTypeDef* PID, double error);    //获取PID函数
    void  (*ResetPid)(struct PID_IncTypeDef* PID);              //PID系统复位
}PID_IncTypeDef, *PID_IncTypeDefP;


extern PID_IncTypeDef xMotor;       //X轴PID控制系统
extern PID_IncTypeDef yMotor;       //Y轴PID控制系统


//float MyGetPid(struct PID_IncTypeDef* PID, float error);                  //获取位置式PID函数
int   MyGetLocPID (struct PID_IncTypeDef* PID, double error);            	//获取位置式PID函数
int   MyGetRcLocPID (struct PID_IncTypeDef* PID, double error);            	//获取位置式PID函数 + 一阶低通RC滤波器
int   MyIncPID (struct PID_IncTypeDef* PID, double error);					//获取增量式PID函数
void  MyReset(struct PID_IncTypeDef* PID);                                  //PID系统复位
void  SetPid(unsigned char motor, long Kp, long Ki, long Kd);               //设置PID参数
void  DisplayPid(void);                                                     //显示PID参数
void  DisplayPidIntegrator(void);											//显示PID积分

#endif  /* pid.h */

